// 定义博客文章结构体
pub struct Post {
    // 使用状态模式管理文章生命周期，当前状态为一个动态 trait 对象
    state: Option<Box<dyn State>>,
    // 文章内容字段，用于存储实际文本
    content: String,
}

impl Post {
    // 创建一个新的博客文章实例，默认处于 Draft（草稿）状态
    pub fn new() -> Post {
        Post {
            state: Some(Box::new(Draft {})),   // 初始化状态为草稿
            content: String::from(""),         // 初始内容为空
        }
    }

    // 向文章中添加文本内容
    pub fn add_text(&mut self, text: &str) {
        self.content.push_str(text);  // 将传入的文本追加到 content 字段中
    }

    // 请求审核：将文章状态从 Draft 变更为 PendingReview（待审核）
    pub fn request_review(&mut self) {
        if let Some(s) = self.state.take() {
            self.state = Some(s.request_review());
        }
    }

    // 批准文章：将文章状态从 PendingReview 变更为 Published（已发布）
    pub fn approve(&mut self) {
        if let Some(s) = self.state.take() {
            self.state = Some(s.approve());
        }
    }

    // 获取文章内容：调用当前状态对象的 content 方法
    pub fn content(&self) -> &str {
        self.state.as_ref().unwrap().content(self)
    }
}

// 定义状态行为 trait，所有状态必须实现这些方法
trait State {
    // 请求审核时的状态转换逻辑
    fn request_review(self: Box<Self>) -> Box<dyn State>;

    // 批准文章时的状态转换逻辑
    fn approve(self: Box<Self>) -> Box<dyn State>;

    // 获取内容：不同状态下返回不同的内容（默认返回空字符串）
    fn content<'a>(&self, _post: &'a Post) -> &'a str {
        ""  // 默认实现返回空字符串
    }
}

// 草稿状态：初始状态
struct Draft {}

impl State for Draft {
    // 调用 request_review 时，状态变为 PendingReview
    fn request_review(self: Box<Self>) -> Box<dyn State> {
        Box::new(PendingReview {})
    }

    // 调用 approve 时，仍保持 Draft 状态（无效操作）
    fn approve(self: Box<Self>) -> Box<dyn State> {
        self  // 无法批准草稿，状态不变
    }
}

// 待审核状态
struct PendingReview {}

impl State for PendingReview {
    // 再次调用 request_review 时，保持 PendingReview 状态
    fn request_review(self: Box<Self>) -> Box<dyn State> {
        self
    }

    // 调用 approve 时，状态变为 Published
    fn approve(self: Box<Self>) -> Box<dyn State> {
        Box::new(Published {})  // 审核通过，进入发布状态
    }
}

// 已发布状态
struct Published {}

impl State for Published {
    // 一旦发布，再次请求审核不会改变状态
    fn request_review(self: Box<Self>) -> Box<dyn State> {
        self
    }

    // 一旦发布，再次批准也不会改变状态
    fn approve(self: Box<Self>) -> Box<dyn State> {
        self
    }

    // 返回文章内容
    fn content<'a>(&self, post: &'a Post) -> &'a str {
        &post.content  // 返回文章的实际内容
    }
}